<?php
namespace Crud;

use Pinenut\Config;
use Pinenut\Model2\Finder;

/**
 * Copied & Modified by ITokarev
 *
 * Crud Config
 */
abstract class CrudConfig extends Config {

	/**
	 * Параметры для формирования файндера
	 *
	 * @param array $params        	
	 * @return Finder
	 */
	public static function getFinder($params) {
		// Дергаем конфиг с указанным модулем и типами полей формы.
		$configParams = static::getSearchForm();
		
		// Цепляем модель из пришедшего конфига
		$model = static::get('model');
		/* @var $finder Finder */
		$finder = $model::find();
		
		// Перебираем пришедшие пользовательские параметры
		// пустые и не пустые
		foreach ($params as $param => $value) {
			// Проверяем, что параметр не пуст
			if (! empty($value) &&
				isset($configParams['elements'][$param]['searchType'])) {
				// Дергаем тип поля из конфига в соответствие с текущим параметром
				switch ($configParams['elements'][$param]['searchType']) {
					// Equal - должен полностью соответствовать записи (слову / фразе) в базе,
					// включая регистр.
					case 'equal':
						$finder->where($param, $value);
						break;
					// Match - должен частично соответствовать записи (слову/фразе) в базе,
					// не обращая внимания на регистр.
					case 'match':
						$finder->where($param, 
							new \MongoRegex('/' . $value . '/i'));
						break;
					default:
						;
				}
			}
		}
		return $finder;
	}

	/**
	 * Возвращаем конфигурацию формы на создание сущности
	 * пока используем ту же форму что и для редактирования
	 *
	 * @return multitype:\Crud\mixed
	 */
	static function getCreateForm( ) {
		return static::$editFormConfig;
	}

	/**
	 * Возвращаем конфигурацию формы на редактирование
	 *
	 * @return multitype:\Crud\mixed
	 */
	static function getEditForm( ) {
		return static::$editFormConfig;
	}

	/**
	 * Возвращаем конфигурацию формы на удаление
	 *
	 * @return multitype:\Crud\mixed
	 */
	static function getDeleteForm( ) {
		return static::$deleteFormConfig;
	}

	/**
	 * Общщая форма удаления для ольшенства сущностей будет одинаковой
	 *
	 * @var mixed[]
	 */
	static $deleteFormConfig = array(
		'htmlOptions' => array(
			'method' => 'POST',
			'class' => 'form-horizontal custom-submit crud-ajax-form',
			'role' => 'form'
		),
		'style' => 'modal',
		'elements' => array(
			'submit' => array(
				'label' => 'Delete',
				'type' => 'submit'
			)
		)
	);

	
	/**
	 * Возвращаем конфигурацию формы поиска
	 *
	 * @return multitype:\Crud\mixed
	 */
	static function getSearchForm( ) {
		return static::$searchFormConfig;
	}
	
	static $searchFormConfig = [
		// Здесь различные HTML-опции для формы
		'htmlOptions' => [
			'method' => 'POST',
			'class' => 'form-horizontal clearfix active-crud-form',
			'id' => 'SearchFormConfig'
		],
		// Список и настройка элементов формы (поля / кнопки и т.д.)
		// Для поиска по тождественно-равному слову / фразе: 'searchType' => 'equal'.
		// Для поиска по частичному слову / фразе: 'searchType' => 'match'.
		'elements' => []
	];

	static $editFormConfig = array(
		'htmlOptions' => array(
			'method' => 'POST',
			// два последних класса для изоляции отработки отправки формы именно обработчиком этого модуля
			'class' => 'form-horizontal custom-submit crud-ajax-form',
			'role' => 'form'
		),
		'style' => 'modal',
		'elements' => array(
			'submit' => array(
				'label' => 'Save',
				'type' => 'submit'
			)
		)
	);

	static $tableConfig = [
		
		/**
		 *
		 * @var array конфиг для таблицы, в columns хранится список колонок, в каждой колумн хранится поле из которого мы его берем, и возможность сортировки
		 *      ,если указан mapaction тогда будет другой результат, в мапакшене надо определить акшен, который мы будем вызывать, филдспараметры, это те поля из модели которые пойдут в параметры
		 *      каунтонпайдж это количество элементов на странице, дефолтное 10.
		 */
		
		'countOnPage' => 20,
		'columns' => [
		],
	];
	
	/**
	 * Возвращаем конфигурацию таблицы
	 *
	 * @return multitype:\Crud\mixed
	 */
	static function getTable( ) {
		return static::$tableConfig;
	}
}